﻿using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Inovout.Web.Mvc;
using Inovout.Web.Mvc.Html;
using System.Web.Mvc;

namespace System.Web.Mvc.Html
{
    /// <summary>
    /// Widget-Table
    /// </summary>
    public static class TableExtensions
    {
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件 
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="source">数据源</param>
        /// <param name="emptyCollectionRender">数据源为Empty时，呈现方法</param>
        /// <returns>WigetModelMetadataHelper对象实例，可进一步配置Table的列设置</returns>
        public static WigetModelMetadataHelper<TModel> Table<TModel>(this HtmlHelper html, IEnumerable<TModel> source, Func<object> emptyCollectionRender)
        {
            var elementMetadata = ModelMetadataProviders.Current.GetMetadataForType(() => null, typeof(TModel)).AsWidgetModelMetadata();
            elementMetadata.ModelDeclaringType = typeof(TModel);
            return new WigetModelMetadataHelper<TModel>(
             () => Table(html, source, elementMetadata, emptyCollectionRender, "_Table"), elementMetadata);
        }
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="emptyCollectionRender">数据源为Empty时，呈现方法</param>
        /// <returns>WigetModelMetadataHelper对象实例，可进一步配置Table的列设置</returns>
        public static WigetModelMetadataHelper<TModel> Table<TModel>(this HtmlHelper<IEnumerable<TModel>> html, Func<object> emptyCollectionRender)
        {
            var elementMetadata = html.ViewData.ModelMetadata.AsWidgetCollectionModelMetadata().WidgetElementModelMetadata;
            elementMetadata.ModelDeclaringType = typeof(TModel);
            return new WigetModelMetadataHelper<TModel>(
             () => Table(html, emptyCollectionRender, "_Table"), elementMetadata);
        }
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="emptyCollectionRender">数据源为Empty时，呈现方法</param>
        /// <param name="properties">需显示的属性名数组</param>
        /// <returns>IHtmlString对象实例</returns>
        public static IHtmlString Table<TModel>(this HtmlHelper<IEnumerable<TModel>> html, Func<object> emptyCollectionRender, params Expression<Func<TModel, object>>[] properties)
        {
            return Table(html, emptyCollectionRender, "_Table", properties);
        }
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="partialViewName">局部视图名</param>
        /// <returns>IHtmlString对象实例</returns>
        public static IHtmlString Table<TModel>(this HtmlHelper<IEnumerable<TModel>> html, string partialViewName = "_Table")
        {
            return Table(html, partialViewName);
        }
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="emptyCollectionRender">数据源为Empty时，呈现方法</param>
        /// <param name="partialViewName">局部视图名称</param>
        /// <param name="properties">需显示的属性名数组</param>
        /// <returns>IHtmlString对象实例</returns>
        public static IHtmlString Table<TModel>(this HtmlHelper<IEnumerable<TModel>> html, Func<object> emptyCollectionRender, string partialViewName = "_Table", params Expression<Func<TModel, object>>[] properties)
        {
            return Table(html, html.ViewData.Model, html.ViewData.ModelMetadata.AsWidgetCollectionModelMetadata().WidgetElementModelMetadata, emptyCollectionRender, partialViewName, properties);
        }
        /// <summary>
        /// 使用Table控件，如果集合类型为IpagedSet，自动包含分页控件
        /// </summary>
        /// <typeparam name="TModel">集合中的模型类型</typeparam>
        /// <param name="html">HtmlHelper对象实例</param>
        /// <param name="source">数据源</param>
        /// <param name="elemnetMetadata">集合元素元数据</param>
        /// <param name="emptyCollectionRender">数据源为Empty时，呈现方法</param>
        /// <param name="partialViewName">局部视图名称</param>
        /// <param name="properties">需显示的属性名数组</param>
        /// <returns>IHtmlString对象实例</returns>
        public static IHtmlString Table<TModel>(this HtmlHelper html, IEnumerable<TModel> source, WidgetModelMetadata elemnetMetadata, Func<object> emptyCollectionRender, string partialViewName = "_Table", params Expression<Func<TModel, object>>[] properties)
        {

            WidgetDataDictionary viewData = new WidgetDataDictionary<IEnumerable<TModel>>(source, html.ViewData,
                ModelMetadataProviders.Current.GetMetadataForType(()=>source,typeof(IEnumerable<TModel>)).AsWidgetModelMetadata());
            if (properties != null && properties.Any())
            {
                viewData.ModelMetadata.AsWidgetCollectionModelMetadata().WidgetElementModelMetadata.SelectModelDeclaringTypeProperties(properties.Select(p => ExpressionHelper.GetExpressionText(p)).ToArray());
            }
            //一定注意，如果起用新的WidgetDataDictionary，一定不能用老的。
            viewData.ModelMetadata.AsWidgetCollectionModelMetadata().EmptyCollectionRender(emptyCollectionRender);
            viewData.ModelMetadata.AsWidgetCollectionModelMetadata().WidgetElementModelMetadata = elemnetMetadata;
            //集合类型Model与需显示的属性并不属于同个对象，Model==IEnumerable,properties为集合内的对象属性
            return html.Partial(partialViewName, viewData);
        }

    }


}
